﻿// ConsoleApplication19.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <iostream>
#include <string>
#include <limits.h>
#include <iostream>
#include <memory>
using namespace std;

typedef unsigned int        UINT;

class CMyFunction
{
public:
	CMyFunction(UINT yBak);
	~CMyFunction();

	const UINT  s14 =35;  // C++17 起

	const UINT y223;  // 声明

private:

};



CMyFunction::CMyFunction(UINT yBak):y223(yBak)
{
    //s14 = 4543;
}

CMyFunction::~CMyFunction()
{
}

class MyClass {
private:
    const int myConst;  // 常量成员变量

public:
    // 构造函数中必须通过初始化列表初始化 const 成员
    MyClass(int val) : myConst(val) {}

    void print() const {
        std::cout << "myConst = " << myConst << std::endl;
    }
};


class Info {
public:
    const int id;
    const std::string name;
    mutable size_t datalength;

    Info(int i, const std::string& n) : id(i), name(n) {}

    void print() const {
        std::cout << "ID: " << id << ", Name: " << name << std::endl;
    }
};




class MyObject {
public:
    MyObject() {
        std::cout << "MyObject Constructor\n";
    }
    ~MyObject() {
        std::cout << "MyObject Destructor\n";
    }
    void sayHello() {
        std::cout << "Hello from MyObject!\n";
    }
};

class Manager {
private:
    std::unique_ptr<MyObject> ptr;

public:
    void createObject() {
        // 将 new 出来的对象存入智能指针（独立语句）
        ptr.reset(new MyObject());

        // 或更现代的写法（推荐）：
        // ptr = std::make_unique<MyObject>();
    }

    void useObject() {
        if (ptr) {
            ptr->sayHello();
        }
        else {
            std::cout << "Object not created yet.\n";
        }
    }
};

class MyObject22 {
public:
    MyObject22() {
        std::cout << "MyObject Constructor\n";
    }
    ~MyObject22() {
        std::cout << "MyObject Destructor\n";
    }
    void doSomething22() {



        std::cout << "MyObject is working\n";
    }
};

class Manager22 {
private:
    std::unique_ptr<MyObject22> ptr;

public:
    Manager22() {
        std::cout << "Manager Constructor\n";
    }

    ~Manager22() {
        std::cout << "Manager Destructor\n";
        // 不需要 delete，智能指针会自动释放
        // 但为了说明资源释放，可以打印一条日志
        if (ptr) {
            std::cout << "Releasing MyObject...\n";
        }
    }

    void init() {
        // 独立语句，将 new 的对象交给智能指针
        ptr.reset(new MyObject22());

        // 推荐写法是：ptr = std::make_unique<MyObject>();
    }

    void run() {
        if (ptr) {
            ptr->doSomething22();
        }
    }
};
 
//切割全局命名空间
namespace sdm {
    int label;
    static const double BOOK_VERSION;
    class Handle { };
    static Handle& getHandle() { 
        Handle* ptr = nullptr;
        return  *ptr;
    }

}
const double BOOK_VERSION = 2.0;


//切割全局命名空间
namespace another {
    int label;
    static const double BOOK_VERSION;
}

int& GetLocalReference() {
    int localVar = 42;  // 栈内存上的局部变量
    return localVar;    // 返回了引用，但localVar会在函数返回后被销毁
}


int main()
{
    
        int& ref = GetLocalReference();  // ref 是悬垂引用（dangling reference）
        std::cout << "ref = " << ref << std::endl;  // 访问已经释放的内存，行为未定义
    

    {
        //使用名称符号
        typedef sdm::Handle Handle;
        const double& BOOK_VERSION = another::BOOK_VERSION;
        sdm::Handle& (* const getHandle) () = sdm::getHandle;

    }
    {
        // 方式 1：使用 new 显式创建对象
        std::unique_ptr<MyObject22> ptr1;
        ptr1.reset(new MyObject22());  // 使用 new 创建并交给 unique_ptr 管理
       // ptr1->init();
       // ptr1->run();           // 使用对象方法
        ptr1->doSomething22();
        // 方式 2：推荐使用 make_unique（从 C++14 开始）
        auto ptr2 = std::make_unique<MyObject22>();  // 更安全，不需要手动 new
       // ptr2->run();

    }

    {
        Manager22 m;
        m.init();   // 独立语句初始化对象
        m.run();    // 使用对象
    } // 作用域结束，Manager 和 MyObject 被自动释放

    std::cout << "Program End\n";
  

    Manager mgr;
    mgr.createObject(); // 独立语句，创建对象并存储
    mgr.useObject();

 
    Info info(1, "Alice");
    info.print();
 //   return 0;
    UINT k1 = std::numeric_limits<UINT>::max();
    //numeric_limits<int>::fmin()
	//UINT k1 = CMyFunction::s14;

	CMyFunction  myfunc(1435);

    std::cout << "Hello World!\n";
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
